<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">



<link rel="stylesheet" href="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/main.css" type="text/css">
    <script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/jquery_002.js" type="text/javascript"></script>
    <script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/script.js" type="text/javascript"></script>
    <script language="javascript">
        function siteSearch(e, strUrl, strSearchParam, strSearchControl)
        {
        	if (e.keyCode == 13)
	        {
	            // force a mouseover
	            btnSearchOver();
	            
                // let the click event do the work
	            return(doSiteSearch(strUrl, strSearchParam, strSearchControl));
            }
            else
            {
                // allow further processing
                return(true);
            } 
        }
        var m_over = false;
        function btnSearchOver() { m_over = true; }
        function btnSearchOut() { m_over = false; }
        function doSiteSearch(strUrl, strSearchParam, strSearchControl)
        {
        	if (m_over == true)
	        {
                // get the text and strip any spaces
                var strText = document.getElementById(strSearchControl).value;
                while (strText.substring(0,1) == ' ') strText = strText.substring(1,strText.length);
                while (strText.substring(strText.length-1,strText.length) == ' ') strText = strText.substring(0,strText.length-1);
      
                // add the parameters
                strUrl = strUrl + "?" + strSearchParam + "=" + encodeString(strText);
             
                // now navigate
                document.location.href = strUrl;
            }
                            
            // stop further processing
            return(false);
        }        
        function encodeString(plaintext)
        {
            var encodedtext = "";
            for (var i=0; i<plaintext.length; i++)
            {
                if (plaintext.charAt(i) == " ")
                    encodedtext += "+";
                else
                    encodedtext += plaintext.charAt(i);
            }
            return(escape(encodedtext));
        }
    </script>
    
  <link rel="stylesheet" href="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/colorbox.css" type="text/css">
<link href="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/net.css" type="text/css" rel="stylesheet"><meta description="If you would like to learn how to build and customize your very own Windows service to retrieve posts from multiple RSS feeds, and then store those posts in a SQL Server database, let John Papa guide you through his tutorial."><meta keywords="RSS feed, Windows service, gather RSS, ASP.NET"><title>
	Gathering RSS Feeds using Visual Studio and RSS.NET
</title></head><body><div style="display: none;" id="cboxOverlay"></div><div style="padding-bottom: 42px; padding-right: 42px; display: none;" class="" id="colorbox"><div id="cboxWrapper"><div><div style="float: left;" id="cboxTopLeft"></div><div style="float: left;" id="cboxTopCenter"></div><div style="float: left;" id="cboxTopRight"></div></div><div style="clear: left;"><div style="float: left;" id="cboxMiddleLeft"></div><div style="float: left;" id="cboxContent"><div class="" id="cboxLoadedContent" style="width: 0pt; height: 0pt; overflow: hidden;"></div><div class="" id="cboxLoadingOverlay"></div><div class="" id="cboxLoadingGraphic"></div><div class="" id="cboxTitle"></div><div class="" id="cboxCurrent"></div><div class="" id="cboxNext"></div><div class="" id="cboxPrevious"></div><div class="" id="cboxSlideshow"></div><div class="" id="cboxClose"></div></div><div style="float: left;" id="cboxMiddleRight"></div></div><div style="clear: left;"><div style="float: left;" id="cboxBottomLeft"></div><div style="float: left;" id="cboxBottomCenter"></div><div style="float: left;" id="cboxBottomRight"></div></div></div><div style="position: absolute; width: 9999px; visibility: hidden; display: none;"></div></div>

  <div style="z-index: 50;" id="corner-peel">
	  <a href="http://monitor.red-gate.com/?utm_source=simpletalk&amp;utm_medium=peel&amp;utm_content=corner_peel201104&amp;utm_campaign=sqlmonitor">
      <img style="overflow: hidden; width: 82px; height: 85px;" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/corner-peel.png" alt="Click here to monitor SSC">
    </a>
	  <div style="overflow: hidden; width: 80px; height: 80px;" id="corner-peel-behind"></div>
  </div>

<form name="aspnetForm" method="post" action="http://www.simple-talk.com/content/article.aspx?article=388" id="aspnetForm">
<div>
<input name="__EVENTTARGET" id="__EVENTTARGET" value="" type="hidden">
<input name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" type="hidden">
<input name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTg5ODQ5NzU3N2QYBAUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgwFD2N0bDAwJGJ0blNlYXJjaAUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nMQUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nMQUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nMgUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nMgUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nMwUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nMwUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nNAUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nNAUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nNQUcY3RsMDAkTWFpbkNvbnRlbnQkcmFkUmF0aW5nNQUgY3RsMDAkTWFpbkNvbnRlbnQkYnRuUmF0ZUFydGljbGUFBl9fUGFnZQ8UKwADZAXhAUlmIHlvdSB3b3VsZCBsaWtlIHRvIGxlYXJuIGhvdyB0byBidWlsZCBhbmQgY3VzdG9taXplIHlvdXIgdmVyeSBvd24gV2luZG93cyBzZXJ2aWNlIHRvIHJldHJpZXZlIHBvc3RzIGZyb20gbXVsdGlwbGUgUlNTIGZlZWRzLCBhbmQgdGhlbiBzdG9yZSB0aG9zZSBwb3N0cyBpbiBhIFNRTCBTZXJ2ZXIgZGF0YWJhc2UsIGxldCBKb2huIFBhcGEgZ3VpZGUgeW91IHRocm91Z2ggaGlzIHR1dG9yaWFsLgUuUlNTIGZlZWQsIFdpbmRvd3Mgc2VydmljZSwgZ2F0aGVyIFJTUywgQVNQLk5FVGQFHGN0bDAwJE1haW5Db250ZW50JEZvcnVtVmlldzEPFCsAAmQC4aIDZAURY3RsMDAkTmF2aWdhdGlvbjEPFCsAAmQy+gQAAQAAAP////8BAAAAAAAAAAwCAAAAP1dlYlNpdGUsIFZlcnNpb249MS4zLjAuMjYsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAQBAAAAeVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU2ltcGxlVGFsay5NZW51SXRlbSwgV2ViU2l0ZSwgVmVyc2lvbj0xLjMuMC4yNiwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAABVTaW1wbGVUYWxrLk1lbnVJdGVtW10CAAAACAgJAwAAAAMAAAADAAAABwMAAAAAAQAAAAQAAAAEE1NpbXBsZVRhbGsuTWVudUl0ZW0CAAAACQQAAAAJBQAAAAkGAAAACgUEAAAAE1NpbXBsZVRhbGsuTWVudUl0ZW0EAAAADG1fQ2hpbGRDb3VudAptX1NlbGVjdGVkB21fVGl0bGUFbV9VcmwAAAEBCAECAAAAAAAAAAAGBwAAAAkuTkVUIEhvbWUGCAAAACJodHRwOi8vd3d3LnNpbXBsZS10YWxrLmNvbS9kb3RuZXQvAQUAAAAEAAAAAAAAAAAGCQAAAAouTmV0IFRvb2xzBgoAAAAtaHR0cDovL3d3dy5zaW1wbGUtdGFsay5jb20vZG90bmV0Ly5uZXQtdG9vbHMvAQYAAAAEAAAAAAAAAAAGCwAAADNHYXRoZXJpbmcgUlNTIEZlZWRzIHVzaW5nIFZpc3VhbCBTdHVkaW8gYW5kIFJTUy5ORVQGDAAAAAALZA==" type="hidden">
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
    theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>


<script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/WebResource.js" type="text/javascript"></script>


<script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/ScriptResource_002.js" type="text/javascript"></script>
<script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/ScriptResource.js" type="text/javascript"></script>
    <script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ctl00$ScriptManager1', document.getElementById('aspnetForm'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);
//]]>
</script>

    <script language="javascript" type="text/javascript">
        function EndRequestHandler()
        {
            if (theForm._initialAction == undefined)
                theForm._initialAction = theForm.action;
            else
                theForm.action = theForm._initialAction;
        }
        if( typeof(Sys) != "undefined" )
        {
            EndRequestHandler();
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
        }
    </script>
    <div class="site">
        <div class="page">
            <div class="header">
                <div class="search">
					<div class="redgate"><a href="http://www.red-gate.com/?utm_source=simpletalk&amp;utm_medium=textad&amp;utm_campaign=homepage"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/aservicefromredgate.gif" alt="A service from Red Gate" width="133" height="16"></a></div>
					<div class="searchform"><table align="right"><tbody><tr><td><input name="ctl00$txtSearch" id="ctl00_txtSearch" class="txtSearch" onkeydown="return(siteSearch(event,'http://www.simple-talk.com/search/default.aspx','search','ctl00_txtSearch'));" type="text"></td><td><input name="ctl00$btnSearch" id="ctl00_btnSearch" class="btnSearch" onmouseover="btnSearchOver();" onmouseout="btnSearchOut();" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/btn_search_56x19.gif" onclick="return(doSiteSearch('http://www.simple-talk.com/search/default.aspx','search','ctl00_txtSearch'));WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$btnSearch&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" style="border-width: 0px;" type="image"></td></tr></tbody></table></div>
				</div>
                <div class="logo"><a id="ctl00_lnkGotoHome" href="http://www.simple-talk.com/default.aspx"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/1px.gif" width="250" height="55"></a></div>
            </div>
            

<div class="mainnav">
    <div class="primarynav">
        <a id="ctl00_Navigation1_lnkGotoHome" href="http://www.simple-talk.com/default.aspx">Home</a>
        <a id="ctl00_Navigation1_lnkGotoSql" href="http://www.simple-talk.com/sql/">SQL</a>
        <a id="ctl00_Navigation1_lnkGotoNet" class="on" href="http://www.simple-talk.com/dotnet/">.NET</a>
        <a id="ctl00_Navigation1_lnkGotoExchange" href="http://www.simple-talk.com/sysadmin/">SysAdmin</a>
        <a id="ctl00_Navigation1_lnkGotoOpinion" href="http://www.simple-talk.com/opinion/">Opinion</a>
        <a id="ctl00_Navigation1_lnkGotoBlogs" href="http://www.simple-talk.com/community/blogs/">Blogs</a>
        <a id="ctl00_Navigation1_lnkGotoForums" href="http://www.simple-talk.com/community/forums/">Forums</a>
        <a id="ctl00_Navigation1_lnkGotoBooks" href="http://www.simple-talk.com/books/">Books</a>
    </div>
     <div class="membernav">
        
        <span id="ctl00_Navigation1_panAnonymous"><a id="ctl00_Navigation1_lnkLogin" href="http://www.simple-talk.com/community/login.aspx?ReturnUrl=%2fdotnet%2f.net-tools%2fgathering-rss-feeds-using-visual-studio-and-rss.net%2f">Sign in</a>
            &nbsp;|&nbsp;<a id="ctl00_Navigation1_lnkJoin" href="http://www.simple-talk.com/community/user/CreateUser.aspx?ReturnUrl=%2fdotnet%2f.net-tools%2fgathering-rss-feeds-using-visual-studio-and-rss.net%2f">Join</a></span>
        &nbsp;|&nbsp;<a id="ctl00_Navigation1_lnkHelp" href="http://www.simple-talk.com/community/languages/en-US/docs/faq.aspx">Help</a>
        
    </div>
</div>
<div class="subnav">
    
            <a id="ctl00_Navigation1_repSubMenu_ctl00_lnkItem" href="http://www.simple-talk.com/dotnet/">.NET Home</a>
        &nbsp;&gt;&nbsp;
            <a id="ctl00_Navigation1_repSubMenu_ctl02_lnkItem" href="http://www.simple-talk.com/dotnet/.net-tools/">.Net Tools</a>
        &nbsp;&gt;&nbsp;
            <span>Gathering RSS Feeds using Visual Studio and RSS.NET</span>
        
</div>
            <div class="maincontent">
                
  <div class="article">
  
    <div id="ctl00_MainContent_panSummary" class="summarybox">
	
	  <div class="header"></div>
	  <div class="middle">
		<div class="summaryboxcontent">
          Av rating: <img id="ctl00_MainContent_imgRating1" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_net_4star_70x13.gif" style="height: 13px; width: 70px; border-width: 0px;"><br>
		  Total votes: 21<br>
		  Total comments: 10
        </div>
	    <div class="summaryboxlines"><img id="ctl00_MainContent_imgLines" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/summary_net_lines_176x3.gif" style="height: 3px; width: 176px; border-width: 0px;"></div>
	    <div class="summaryboxcontent2">
          <img id="ctl00_MainContent_RelatedFiles1_repFiles_ctl00_imgDownload" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_net_code_14x11.gif" style="height: 11px; width: 14px; border-width: 0px;">&nbsp;<a id="ctl00_MainContent_RelatedFiles1_repFiles_ctl00_lnkLink" href="http://www.simple-talk.com/content/file.ashx?file=501">Code.zip</a><br>

		  <img id="ctl00_MainContent_imgEmail" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_net_email_13x11.gif" style="height: 11px; width: 14px; border-width: 0px;">&nbsp;<a id="ctl00_MainContent_lnkEmail" href="http://www.simple-talk.com/content/email.aspx?article=388">send to a friend</a><br>
		  <img id="ctl00_MainContent_imgPrint" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_net_print_13x11.gif" style="height: 11px; width: 14px; border-width: 0px;">&nbsp;<a id="ctl00_MainContent_lnkPrint" href="http://www.simple-talk.com/content/print.aspx?article=388" target="_blank">printer friendly version</a><br>
	    </div>
	  </div>
	  <div class="footer"></div>
	
</div>

    <br><br>
    <img id="ctl00_MainContent_imgAuthor" class="authorpicture" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/82.gif" alt="John Papa" style="border-width: 0px;" align="left">
    <div class="articletitle">Gathering RSS Feeds using Visual Studio and RSS.NET</div>
    <div class="date">04 May 2007</div>
    <div class="author">by <a id="ctl00_MainContent_lnkAuthor" rel="author" href="http://www.simple-talk.com/author/john-papa/">John Papa</a></div>

    <div class="clear"></div>

	<p>Integrating RSS feeds into applications has become very popular. 
There are several tools (such as Microsoft Outlook 2007) available to 
read blogs and news from RSS feeds. There are also some tools available 
(such as RSS.NET and the ASP.NET team's RSS Toolkit) that can aid you in
 the development of customizing feeds in your applications. This article
 will use the RSS.NET assembly, which can be freely downloaded and used 
from <a href="http://www.rssdotnet.com/">http://www.rssdotnet.com/</a>.</p>
<h3>Application overview</h3>
<p>This article will explain how to create a custom Windows Service that
 retrieves posts from multiple RSS feeds and then stores them in a SQL 
Server database. Once you store the posts in the database you can then 
retrieve them and display them on a web site, so you can combine 
multiple feeds and their posts in a list on a web page, or perhaps in a 
WinForm application. When the Windows Service retrieves the posts from 
each RSS feed, it filters out any duplicate posts before saving them to 
the database.</p>
<p>NOTE:<br><i>All source code for the Windows Service is available to 
be downloaded as well as the SQL scripts to generate the database in SQL
 Server. See the CODE DOWNLOAD link in the header of this article.</i></p>
<p>Figure 1 shows a high level overview of the application. The Windows 
service will poll a list of RSS feeds using the RSS.NET toolkit at a 
defined interval. The list of RSS feeds and their URLs are stored in a 
local SQL Server DB. Using the RSS.NET library, each feed's posts are 
retrieved and examined. Duplicate posts are ignored, but new posts are 
inserted into a SQL Server database. </p>
<p><img title="" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/388-Figure1.gif" border="0"></p>
<p><em>Figure 1 – Gathering posts from feeds</em></p>
<h3>Setting up the database </h3>
<p>You can execute the entire database setup script from the <b>DBScript.sql</b>&nbsp;file in the zipped code file attached to this article. The database is used to store two tables:</p>
<ul type="disc">
<li>Feed – a list of feeds that will be polled for their posts 
</li><li>Post – a list of the posts for each feed</li></ul>
<p>The tables and their basic schema are shown in Figure 2.</p>
<p><img title="" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/388-Figure2.gif" border="0"></p>
<p><em>Figure 2 – The BlogRoll Database</em></p>
<p>The DBScript.sql file first sets up the SQL Server database and names it <b>BlogRoll</b>. You will want to adjust the location of the data and log files on your PC to a place besides C:\. Once the <b>BlogRoll</b> database is created, the <b>Feed</b> and <b>Post</b> tables are created. The <b>Feed</b>
 table stores the title of the feed, the sequence in which the feed 
should be polled in regard to other feeds, as well as the URL of the 
feed. </p>
<p>The <b>Feed</b> table also stores a <b>LastPostGuidName</b> column. 
This column represents a unique identifier for the last post that was 
retrieved for this feed. When the feed is polled again, this column's 
value is compared against each post that is retrieved. When a match is 
found, the Windows Service will know that the rest of the posts have 
already been retrieved so it will ignore the remaining duplicate posts. 
This column helps keep only unique posts in the <b>Post</b> table. This column allows NULL values because the first time a feed is polled, there are no posts already in the database.</p>
<p>I started the <b>Post</b> table with a list of two RSS feeds which point to my blog (<a href="http://codebetter.com/blogs/john.papa/rss.aspx">http://codebetter.com/blogs/john.papa/rss.aspx</a>) and the ADO.NET team's blog (<a href="http://blogs.msdn.com/adonet/rss.xml">http://blogs.msdn.com/adonet/rss.xml</a>).
 The DBScrpt.sql file inserts these two feeds as samples that you can 
start with. You can add more RSS feeds to this list by adding records to
 the <b>Post</b> table. </p>
<p>The <b>Post </b>table stores a reference to the <b>Feed</b> table, so
 the posts can be associated with the feed from which they came. It also
 stores the title of the post, the date the post was published, its 
author, the body of the post and a link directly to the post.</p>
<p>Finally, the DBScript.sql file creates a SQL Server login and user named <b>BlogRollUser</b>. It gives the <b>BlogRollUser</b> permission to access the <b>BlogRoll</b> database and grants it permission to perform CRUD (Create, Read, Update, Delete) operations on the <b>Feed</b> and <b>Post</b> tables. Of course, you can set up your application to use any user that you want if you do not want to use the <b>BlogRollUser</b> that the script generates for you.</p>
<h3>Gathering the feed list</h3>
<p>The next step is to create the Windows Service that will poll the RSS
 feeds. I started by creating a Windows Service project through Visual 
Studio.NET and naming it <b>FeedGatheringService</b>. I then referenced the <b>System.Transactions</b> assembly as well as the RSS.NET assembly.</p>
<p>I added a Windows Service with the same name as the project and created a <b>System.Timers.Timer</b>, named <b>feedGathererTimer</b>,
 in it. In the Service's constructor I initialize the timer to run every
 60 seconds. I also add an event handler for the timer's <b>Elapsed </b>event. This event will be used to grab the list of feeds and to poll them for their new posts.</p><code style="font-size: 12px;"><span style="color: blue;">public&nbsp;</span><span style="color: black;">FeedGatheringService</span><span style="color: gray;">() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent</span><span style="color: gray;">(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">feedGathererTimer&nbsp;</span><span style="color: blue;">=&nbsp;new&nbsp;</span><span style="color: black;">System.Timers.Timer</span><span style="color: gray;">(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">feedGathererTimer.Interval&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">30000</span><span style="color: gray;">;&nbsp;</span><span style="color: green;">//900000; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">feedGathererTimer.Enabled&nbsp;</span><span style="color: blue;">=&nbsp;false</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">feedGathererTimer.Elapsed&nbsp;</span><span style="color: gray;">+</span><span style="color: blue;">=&nbsp;new&nbsp;</span><span style="color: black;">ElapsedEventHandler</span><span style="color: gray;">(</span><span style="color: black;">feedGathererTimer_Elapsed</span><span style="color: gray;">); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">}</span></code> 
<p>The <b>feedGathererTimer_Elapsed</b> event grabs a list of feeds from the SQL Server database. I created a <b>Feed</b> class which has a static method called <b>GetList</b>, which queries the database's <b>Feed</b> table for all of the feeds. Each feed row that is retrieved is used to populate a <b>List&lt;Feed&gt;</b>.
 The following listing shows how a connection is opened to the database 
using ADO.NET. The feed list is grabbed and each row is used to create a
 <b>Feed</b> entity through the <b>Feed</b> entity's constructor. Each entity is added to the <b>List&lt;Feed&gt;</b> and finally the list of returned so the service can poll them.</p><code style="font-size: 12px;"><span style="color: blue;">public&nbsp;static&nbsp;</span><span style="color: black;">List</span><span style="color: gray;">&lt;</span><span style="color: black;">Feed</span><span style="color: gray;">&gt;&nbsp;</span><span style="color: black;">GetList</span><span style="color: gray;">() <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: gray;">&lt;</span><span style="color: black;">Feed</span><span style="color: gray;">&gt;&nbsp;</span><span style="color: black;">feedList&nbsp;</span><span style="color: blue;">=&nbsp;new&nbsp;</span><span style="color: black;">List</span><span style="color: gray;">&lt;</span><span style="color: black;">Feed</span><span style="color: gray;">&gt;(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">using&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">SqlConnection&nbsp;cn&nbsp;</span><span style="color: blue;">=&nbsp;new&nbsp;</span><span style="color: black;">SqlConnection</span><span style="color: gray;">(</span><span style="color: black;">Settings.</span><span style="color: blue;">default</span><span style="color: black;">.BlogRollConnectionString</span><span style="color: gray;">)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cn.Open</span><span style="color: gray;">(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">string&nbsp;</span><span style="color: black;">sql&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue;">=&nbsp;</span><span style="color: darkred;">"SELECT&nbsp;ID,&nbsp;Title,&nbsp;Url,&nbsp;LastPostGuidName,&nbsp;DateCreated&nbsp;FROM&nbsp;Feed&nbsp;ORDER&nbsp;BY&nbsp;Sequence"</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">using&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">SqlCommand&nbsp;cmd&nbsp;</span><span style="color: blue;">=&nbsp;new&nbsp;</span><span style="color: black;">SqlCommand</span><span style="color: gray;">(</span><span style="color: black;">sql</span><span style="color: gray;">,&nbsp;</span><span style="color: black;">cn</span><span style="color: gray;">)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd.CommandType&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">CommandType.Text</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">SqlDataReader&nbsp;rdr&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">cmd.ExecuteReader</span><span style="color: gray;">(</span><span style="color: black;">CommandBehavior.CloseConnection</span><span style="color: gray;">); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">while&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">rdr.Read</span><span style="color: gray;">()) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;feedList.Add</span><span style="color: gray;">(</span><span style="color: blue;">new&nbsp;</span><span style="color: black;">Feed</span><span style="color: gray;">(</span><span style="color: black;">Convert.ToInt32</span><span style="color: gray;">(</span><span style="color: black;">rdr["Id"]</span><span style="color: gray;">),&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">Convert.ToDateTime</span><span style="color: gray;">(</span><span style="color: black;">rdr["DateCreated"].ToString</span><span style="color: gray;">()),&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">rdr["Title"].ToString</span><span style="color: gray;">(),&nbsp;</span><span style="color: black;">rdr["Url"].ToString</span><span style="color: gray;">(),&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">rdr["LastPostGuidName"].ToString</span><span style="color: gray;">())); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">return&nbsp;</span><span style="color: black;">feedList</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">}</span></code> 
<h3>Polling the feeds for posts</h3>
<p>Once the <b>List&lt;Feed&gt;</b> has been retrieved, the Service 
iterates through each of them and polls the feeds for their posts. This 
is where a library, such as RSS.NET or the ASP.NET team's RSS toolkit, 
comes in handy. These types of tools make interacting with RSS feeds 
much simpler than if you hit them directly and parse the results. There 
is a considerable amount of exception handling and data cleanup that is 
handled by these libraries, and they are both freely available to use.</p>
<p>RSS.NET has a <b>RssFeed</b> class that exposes a public method called <b>Read</b>,
 which accepts a URL of a feed. It requests a list of posts from the 
feed and returns them to the application. The posts are contained within
 the <b>RssFeed</b> class's <b>Channels</b> collection's <b>Items</b> collection.</p><code style="font-size: 12px;"><span style="color: black;">rssFeed.Channels[0].Items</span></code> 
<p>The following code listing demonstrates how the RSS.NET <b>RssFeed</b> class polls the feed's URL and returns the posts. Each post (represented by the <b>rssItem</b> variable) is then examined to see if its <b>Guid.Name</b>
 matches the last post that was retrieved for this feed (in previous 
polling attempts). The first time this code is executed for a feed the <b>LastPostGuidName </b>value will be NULL. However once a post has been inserted into the <b>Post</b> table, the <b>LastPostGuidName</b> value is updated for the <b>Feed</b> table. If a match is found then the processing for this feed stops as the rest of the posts already exist in the <b>Post</b> table.</p><code style="font-size: 12px;"><span style="color: blue;">public&nbsp;static&nbsp;</span><span style="color: black;">List</span><span style="color: gray;">&lt;</span><span style="color: black;">Post</span><span style="color: gray;">&gt;&nbsp;</span><span style="color: black;">GetNewRssPostsFromUrl</span><span style="color: gray;">(</span><span style="color: black;">Feed&nbsp;feed</span><span style="color: gray;">) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">string&nbsp;</span><span style="color: black;">mostRecentPostGuidName&nbsp;</span><span style="color: blue;">=&nbsp;null</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">List</span><span style="color: gray;">&lt;</span><span style="color: black;">Post</span><span style="color: gray;">&gt;&nbsp;</span><span style="color: black;">postList&nbsp;</span><span style="color: blue;">=&nbsp;new&nbsp;</span><span style="color: black;">List</span><span style="color: gray;">&lt;</span><span style="color: black;">Post</span><span style="color: gray;">&gt;(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">RssFeed&nbsp;rssFeed&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">RssFeed.Read</span><span style="color: gray;">(</span><span style="color: black;">feed.Url</span><span style="color: gray;">); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">if&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">rssFeed.Channels.Count&nbsp;</span><span style="color: blue;">==&nbsp;</span><span style="color: black;">0</span><span style="color: gray;">) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">return&nbsp;</span><span style="color: black;">postList</span><span style="color: gray;">; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: green;">//&nbsp;Get&nbsp;Channel&nbsp;0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">RssChannel&nbsp;channel&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">rssFeed.Channels[0]</span><span style="color: gray;">; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">foreach&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">RssItem&nbsp;rssItem&nbsp;</span><span style="color: blue;">in&nbsp;</span><span style="color: black;">channel.Items</span><span style="color: gray;">) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: green;">//&nbsp;If&nbsp;we&nbsp;already&nbsp;have&nbsp;this&nbsp;post,&nbsp;exit.&nbsp;This&nbsp;means&nbsp;the&nbsp;rest&nbsp;of&nbsp;posts&nbsp;are&nbsp;old.
 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">if&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">feed.LastPostGuidName&nbsp;</span><span style="color: blue;">==&nbsp;</span><span style="color: black;">rssItem.Guid.Name</span><span style="color: gray;">) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">break</span><span style="color: gray;">; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: green;">//&nbsp;Grab&nbsp;the&nbsp;first&nbsp;Post's&nbsp;Guid <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">if&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">mostRecentPostGuidName&nbsp;</span><span style="color: blue;">==&nbsp;null</span><span style="color: gray;">)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">mostRecentPostGuidName&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">rssItem.Guid.Name</span><span style="color: gray;">; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">Post&nbsp;post&nbsp;</span><span style="color: blue;">=&nbsp;new&nbsp;</span><span style="color: black;">Post</span><span style="color: gray;">(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">post.FeedID&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">feed.Id</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">post.Author&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">rssItem.Author</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">post.Link&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">rssItem.Link.ToString</span><span style="color: gray;">(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">post.PostDate&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">rssItem.PubDate</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">post.Body&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">rssItem.Description</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">post.Title&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">rssItem.Title</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">postList.Add</span><span style="color: gray;">(</span><span style="color: black;">post</span><span style="color: gray;">); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">} <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: green;">//&nbsp;Update&nbsp;the&nbsp;Feed's&nbsp;last&nbsp;post&nbsp;setting <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">if&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">mostRecentPostGuidName&nbsp;</span><span style="color: gray;">!=&nbsp;</span><span style="color: blue;">null</span><span style="color: gray;">) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">feed.LastPostGuidName&nbsp;</span><span style="color: blue;">=&nbsp;</span><span style="color: black;">mostRecentPostGuidName</span><span style="color: gray;">; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">return&nbsp;</span><span style="color: black;">postList</span><span style="color: gray;">; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">}</span></code> 
<p>The code then shows that once the post is determined not to be a duplicate that a <b>Post</b> entity is created. The <b>Post </b>entity is created from the values retrieved from the <b>rssItem</b> and then added to a <b>List&lt;Post&gt;</b>. </p>
<p>The final step before returning the <b>List&lt;Post&gt;</b> is to update the <b>LastPostGuidName</b>
 property. This is set so that the next time the polling process occurs 
that it will know what the identifier is for the last post that was 
retrieved. Notice that the posts are not yet inserted into the database.
 The entire process merely gathers the posts and sets the <b>LastPostGuidName</b>.</p>
<h3>Inserting the posts</h3>
<p>Once the <b>List&lt;Post&gt;</b> has been returned to the service, they must be inserted into the database's <b>Post </b>table. The following code in 5 demonstrates how the posts are inserted. First a <b>TransactionScope</b> is instantiated using the <b>System.Transactions</b>
 library. I create a transaction since I want all of the posts for a 
given feed to be inserted together. If any post fails to insert then I 
want all of the posts to rollback. Using the <b>System.Transactions TransactionScope</b>
 class I can maintain a 2-phase commit that will implement this atomic 
transaction. Since this uses a 2-phase commit, it requires that the MS 
Distributed Transaction Coordinator service is running. (Of course, if 
you wish to eliminate the transactions or write them a different way, 
you can simply replace the <b>System.Transactions</b> code with your own transactional code.)</p><code style="font-size: 12px;"><span style="color: blue;">using&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">TransactionScope&nbsp;ts&nbsp;</span><span style="color: blue;">=&nbsp;new&nbsp;</span><span style="color: black;">TransactionScope</span><span style="color: gray;">()) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">{ <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: green;">//&nbsp;if&nbsp;the&nbsp;Feed&nbsp;and&nbsp;its&nbsp;Guid&nbsp;changed,&nbsp;update&nbsp;the&nbsp;feed <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">if&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">feed.LastPostGuidNameChanged</span><span style="color: gray;">) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">feed.Update</span><span style="color: gray;">(); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: green;">//&nbsp;If&nbsp;it&nbsp;has&nbsp;posts,&nbsp;add&nbsp;them <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">if&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">postList.Count&nbsp;</span><span style="color: gray;">&gt;&nbsp;</span><span style="color: black;">0</span><span style="color: gray;">) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue;">foreach&nbsp;</span><span style="color: gray;">(</span><span style="color: black;">Post&nbsp;post&nbsp;</span><span style="color: blue;">in&nbsp;</span><span style="color: black;">postList</span><span style="color: gray;">) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">post.Add</span><span style="color: gray;">(); <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">ts.Complete</span><span style="color: gray;">(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black;">}</span></code> 
<p>The first part of the transaction is to update the <b>LastPostGuidName</b> column in the <b>Feed</b> table. Then, each post is inserted into the <b>Post</b>
 table. Finally, if all goes well and no exception is thrown, the 
transaction is marked complete and it is committed to the database. A 
new transaction is created for each feed, so each feed is separate from 
the next feed.</p>
<h3>Creating an installer</h3>
<p>When creating the Windows Service, I set the timer's interval to 60 
seconds so I could easily debug and watch the feeds populate. However, 
the reality is that I probably do not want this service running every 
minute since feeds do not usually change that often. I suggest that you 
change the timer's interval to something less frequent such as every 15 
minutes (an interval of 900000).</p>
<p>If you want to debug the application, you can adjust the interval back down to 60 seconds for testing purposes.</p>
<p>Once the Windows service was created I needed a way to install the 
service on my machine to try it out (and to debug it). To do this I 
opened the <b>FeedGatheringService.cs</b> file's designer and right-clicked in open space to bring up the context menu shown in Figure 3. I selected the <i>Add Installer</i> option from this menu, which adds a <b>ProjectInstaller.cs</b> file to the project.</p>
<p><img title="" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/388-Figure3.gif" border="0"></p>
<p><em>Figure 3 –Adding the Installer</em></p>
<p>The <b>ProjectInstaller</b> provides a component that will be used to
 install the service process and a component that will be used to 
install the service itself. You can examine these components by opening 
the P<b>rojectInstaller</b> in design view. I set the <b>serviceProcessInstaller1</b> component's <b>Account</b> property to <b>LocalSystem</b>.
 I could have specified a specific user, and in a production application
 I recommend doing just that. However, for demonstration purposes, I 
will use <b>LocalSystem</b> so it is easier to debug the application.</p>
<p>I also set the <b>serviceInstaller1</b> component’s <b>ServiceName</b> property to <b>FeedGatheringService</b> and set its <b>StartType</b>
 to Automatic. This tells the service to start itself automatically when
 the computer is started. I set the description to "Gathers RSS Feeds" 
so the service will have some basic description when viewing it in the 
Services list.</p>
<h3>Install the Windows Service</h3>
<p>Once the project is compiled the service can be installed on the 
computer by following a few simple steps. Open a Visual Studio.NET 
command prompt and change to the <b>bin\Debug</b> directory of the <b>FeedGatheringService</b> project. (You will want to use the <b>bin\Release</b> directory when if you compile a release version.) Execute the following command to install the service on the computer:</p><pre>InstallUtil.exe FeedGatheringService.exe</pre>
<p>The <b>InstallUtil</b> command will install the service and create 
the appropriate registry entries for the service. (If you want to 
uninstall the service you can execute the <b>InstallUtil</b> command 
again with the /u argument.) It will not start the service immediately. 
Keep in mind that the next time the computer is restarted that the 
service will start automatically since I set the <b>StartType</b> property to Automatic in the <b>ServiceInstaller</b> component. Execute the following command in the Visual Studio.Net command window to start the service:</p><pre>net start FeedGatheringService</pre>
<p>Another option to start the service is to right-click on My Computer,
 select Manage from the context menu, open the Services node in the 
tree, locate the <b>FeedGatheringService</b> in the list of services and start it from there.</p>
<h3>Debugging the Service</h3>
<p>Debugging a Windows service is not difficult, but is does require a 
few additional steps beyond what is involved with a WinForm or ASP.NET 
application. First, set a breakpoint in the <b>feedGathererTimer_Elapsed</b>
 event handler so you can watch the code execute. Then, go to the Debug 
menu and select Attach to Process. Make sure that the checkboxes are 
selected so you can see all processes. Next, select the <b>FeedGatheringService</b> from the list of available processes and click the Attach button (shown in Figure 4).</p>
<p><img title="" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/388-Figure4.gif" border="0"></p>
<p><em>Figure 4 - Attaching to the Windows Service</em></p>
<p>If you set the breakpoint in the <b>feedGathererTimer_Elapsed</b> 
event handler then the code will hit the breakpoint and you will be able
 to walk through the code as it executes. The breakpoint will be hit 
once the timer's interval has been reached.</p>
<h3>Wrapping Up</h3>
<p>At this point you now have a Windows service that will gather posts 
from a list of RSS feeds and store them in a database. The code included
 with this article points to a specific database server instance of 
(local)\SQL2005. Remember to change this to reflect the name of your SQL
 Server instance. The posts can now be read using standard ADO.NET data 
access objects and displayed in any of your applications.</p>

    <br><br>This article has been viewed 23984 times.
  </div>

  
<div class="authorpanel">
    <a id="ctl00_MainContent_Author1_lnkImage" title="John Papa" href="http://www.simple-talk.com/author/john-papa/"><img id="ctl00_MainContent_Author1_imgAuthor" class="authorpicture" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/82.gif" alt="John Papa" style="border-width: 0px;" align="left"></a>
    <p><strong>Author profile:</strong> <a id="ctl00_MainContent_Author1_lnkName" href="http://www.simple-talk.com/author/john-papa/">John Papa</a></p>
    <p>John Papa, Senior .NET Consultant at <a href="http://www.aspsoft.com/">ASPSOFT</a>, is a <a href="https://mvp.support.microsoft.com/profile=7D3BBCB7-E956-4730-B3E0-24BD7EAD0D5D">Microsoft MVP [C#]</a>,
 MCSD.NET, and an author of several data access technology books. John 
has over 10 years' experience in developing Microsoft technologies as an
 architect, consultant, and a trainer. He is the author of the Data 
Points column in MSDN Magazine and can often be found speaking at user 
groups, MSDN Web Casts, and industry conferences such as VSLive and 
DevConnections. John is a baseball fanatic who spends most of his summer
 nights rooting for the Yankees with his family and his faithful dog, 
Kadi.  You can contact John at <a href="http://www.johnpapa.net/"> johnpapa.net</a>.<br>
His new book  <a href="http://www.amazon.com/exec/obidos/ASIN/0596523092/johnpanet-20"> Data-Driven Services with Silverlight 2</a> has recently been published.

</p>
    <p><a id="ctl00_MainContent_Author1_lnkSearch" href="http://www.simple-talk.com/author/john-papa/">Search for other articles by John Papa</a></p>
    <div class="clear"></div>
</div>

  <div id="ctl00_MainContent_panVoting" class="rating">
	
    <strong>Rate this article:</strong> &nbsp;&nbsp;Avg rating: <img id="ctl00_MainContent_imgRating2" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_net_4star_70x13.gif" style="height: 13px; width: 70px; border-width: 0px;"> from a total of 21 votes.<br><br>
    <div id="ctl00_MainContent_panToRate">
		
        <table class="rating" border="0">
          <tbody><tr>
	        <td><input id="ctl00_MainContent_radRating1" name="ctl00$MainContent$radRating" value="radRating1" type="radio"><br>Poor</td>
	        <td><input id="ctl00_MainContent_radRating2" name="ctl00$MainContent$radRating" value="radRating2" type="radio"><br>OK</td>
	        <td><input id="ctl00_MainContent_radRating3" name="ctl00$MainContent$radRating" value="radRating3" type="radio"><br>Good</td>
	        <td><input id="ctl00_MainContent_radRating4" name="ctl00$MainContent$radRating" value="radRating4" type="radio"><br>Great</td>
	        <td><input id="ctl00_MainContent_radRating5" name="ctl00$MainContent$radRating" value="radRating5" type="radio"><br>Must read</td>
		    <td>
		        <input name="ctl00$MainContent$btnRateArticle" id="ctl00_MainContent_btnRateArticle" title="Rate article" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/btn_submit.gif" style="height: 19px; width: 56px; border-width: 0px;" type="image">
		    </td>
	      </tr>
        </tbody></table>
    
	</div>
    
    
  
</div>
  
  <div id="ctl00_MainContent_panComments" class="comments">
	
    <a name="forum">&nbsp;</a>
    <div class="haveyoursayheader">
      <div class="title">Have Your Say</div>
        Do you have an opinion on this article? Then <a href="#commentform" class="commentlink"><u>add your comment below</u></a>:
      </div>
      <div class="forumview">
        <div id="ctl00_MainContent_ForumView1_panPostingNotAllowed" style="width: 100%;">
	
    You must be logged in to post to this forum<br><br><a id="ctl00_MainContent_ForumView1_lnkLogin" href="http://www.simple-talk.com/community/login.aspx?ReturnUrl=%2fdotnet%2f.net-tools%2fgathering-rss-feeds-using-visual-studio-and-rss.net%2f">Click here to log in</a>.

</div>


        <br><hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl01_lblSubject">Cool</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl01_lblAuthor">Anonymous</span></i> (<span>not signed in</span>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl01_lblDate">Friday, May 04, 2007 at 12:45 PM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl01_lblMessage">Nice Technique!</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl03_lblSubject">Well done!</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl03_lblAuthor">Anonymous</span></i> (<span>not signed in</span>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl03_lblDate">Wednesday, May 16, 2007 at 10:22 AM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl03_lblMessage">Clearly written well presented. Excellent!</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl05_lblSubject">Nice, </span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl05_lblAuthor">Anonymous</span></i> (<span>not signed in</span>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl05_lblDate">Wednesday, May 16, 2007 at 10:40 AM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl05_lblMessage">I just wondered how to do it....</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl07_lblSubject">Brilliant!</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl07_lblAuthor">Jason</span></i> (<a id="ctl00_MainContent_ForumView1_repPosts_ctl07_lnkProfile" href="http://www.simple-talk.com/community/user/Profile.aspx?UserID=9198">view profile</a>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl07_lblDate">Friday, May 25, 2007 at 3:33 PM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl07_lblMessage">Very
 nice tutorial and easy to follow.  I am having one minor problem - 
nothing is saved to the DB.   During debugging the debugging process 
opens Settings.Designer.cs file and stops at this line: <br>return ((string)(this["BlogRollConnectionString"]));<br><br>The name of my sql server on my local machine is jason\sql2005 which is set in the app.config.<br><br>any ideas?</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl09_lblSubject">Settings</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl09_lblAuthor">John Papa</span></i> (<span>not signed in</span>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl09_lblDate">Friday, May 25, 2007 at 9:04 PM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl09_lblMessage">Jason,<br><br>Check
 your Settings.settings file. This is where the connection string is 
set. You can open it in the designer view in VS.NET and edit it. Or, you
 can open it in Notepad or ay text editor and check its contents. It 
should look like this:<br><br>&lt;?xml version='1.0' encoding='utf-8'?&gt;<br>&lt;SettingsFile
 xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" 
CurrentProfile="(Default)" 
GeneratedClassNamespace="FeedGatheringService.Properties" 
GeneratedClassName="Settings"&gt;<br>  &lt;Profiles /&gt;<br>  &lt;Settings&gt;<br>    &lt;Setting Name="BlogRollConnectionString" Type="System.String" Scope="Application"&gt;<br>
      &lt;Value 
Profile="(Default)"&gt;server=(local)\SQL2005;database=BlogRoll;uid=BlogRollUser;password=somethingorother;Connect
 Timeout=30&lt;/Value&gt;<br>    &lt;/Setting&gt;<br>  &lt;/Settings&gt;<br>&lt;/SettingsFile&gt;</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl11_lblSubject">Re:Settings</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl11_lblAuthor">Jason</span></i> (<a id="ctl00_MainContent_ForumView1_repPosts_ctl11_lnkProfile" href="http://www.simple-talk.com/community/user/Profile.aspx?UserID=9198">view profile</a>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl11_lblDate">Saturday, May 26, 2007 at 2:15 PM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl11_lblMessage">John,<br><br>Yes,
 I did change my Settings.settings file as well as the app.config.  The 
only differenc is my SQL 2005 server is localhost\SQL2005.<br><br>Debugger is still stopping at this line in the Settings.Designer.cs file:<br><br>return ((string)(this["BlogRollConnectionString"]));<br><br>Still think it is the configuration settings?<br><br>Jason</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl13_lblSubject">Re:Settings</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl13_lblAuthor">Jason</span></i> (<a id="ctl00_MainContent_ForumView1_repPosts_ctl13_lnkProfile" href="http://www.simple-talk.com/community/user/Profile.aspx?UserID=9198">view profile</a>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl13_lblDate">Saturday, May 26, 2007 at 3:21 PM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl13_lblMessage">John,<br><br>Yes,
 I did change my Settings.settings file as well as the app.config.  The 
only differenc is my SQL 2005 server is localhost\SQL2005.<br><br>Debugger is still stopping at this line in the Settings.Designer.cs file:<br><br>return ((string)(this["BlogRollConnectionString"]));<br><br>Still think it is the configuration settings?<br><br>Jason</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl15_lblSubject">Error</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl15_lblAuthor">John Papa</span></i> (<span>not signed in</span>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl15_lblDate">Saturday, May 26, 2007 at 8:16 PM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl15_lblMessage">Jason ... Feel free to contact me via my web site at www.johnpapa.net and send me your error information.</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl17_lblSubject">RSS Feed</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl17_lblAuthor">Josh Coswell</span></i> (<span>not signed in</span>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl17_lblDate">Monday, January 07, 2008 at 9:58 AM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl17_lblMessage">I am using your code ( with RSS.NET assembly ) and looks there is some issue with the following type of URL<br><br>http://www.asp.net/news/rss.ashx<br><br>with file extension .ashx<br><br>Please comment.</span></td></tr>
	</tbody></table>
    
        <hr>
    
	<table class="commenttable" width="500" border="0" cellpadding="0" cellspacing="4">
          <tbody><tr><td class="commenttitle">Subject: </td><td><b><span id="ctl00_MainContent_ForumView1_repPosts_ctl19_lblSubject">RSS Feed</span></b></td></tr>
          <tr><td class="commenttitle">Posted by: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl19_lblAuthor">Josh Coswell</span></i> (<span>not signed in</span>)</td></tr>
          <tr><td class="commenttitle">Posted on: </td><td><i><span id="ctl00_MainContent_ForumView1_repPosts_ctl19_lblDate">Monday, January 07, 2008 at 10:07 AM</span></i></td></tr>
          <tr><td class="commenttitle" valign="top">Message: </td><td><span id="ctl00_MainContent_ForumView1_repPosts_ctl19_lblMessage">I am using your code ( with RSS.NET assembly ) and looks there is some issue with the following type of URL<br><br>http://www.asp.net/news/rss.ashx<br><br>with file extension .ashx<br><br>Please comment.</span></td></tr>
	</tbody></table>
    
        <hr>
    



        <a name="commentform">&nbsp;</a>
      </div>
  
</div>
  <script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/swfobject.js"></script>
  <script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/jquery-1.js"></script>
  <script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/jquery_003.js"></script>
  <script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/jquery.js"></script>
  <script>
    $(document).ready(function() {
      $(".video-lightbox").video();
    });
  </script>

            </div> 
            <div class="rightcolumn">
                
    

<div class="sidenav">
    <div class="header"></div>
    <div class="middle">
        
    	        <div class="navitem">
    	            <img id="ctl00_RightColumn_Categories1_repCategories_ctl00_imgArrow" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_arrow_white_5x9.gif" style="height: 9px; width: 5px; border-width: 0px;">&nbsp;&nbsp;<a id="ctl00_RightColumn_Categories1_repCategories_ctl00_lnkCategory" href="http://www.simple-talk.com/dotnet/">.NET Home</a> 
    	        </div>
            
                <img id="ctl00_RightColumn_Categories1_repCategories_ctl01_imgSpacer" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/sidenav_net_lines_320x3.jpg" style="height: 3px; width: 320px; border-width: 0px;"><br>
            
    	        <div class="navitem">
    	            <img id="ctl00_RightColumn_Categories1_repCategories_ctl02_imgArrow" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_arrow_white_5x9.gif" style="height: 9px; width: 5px; border-width: 0px;">&nbsp;&nbsp;<a id="ctl00_RightColumn_Categories1_repCategories_ctl02_lnkCategory" href="http://www.simple-talk.com/dotnet/asp.net/">ASP.Net</a> <span id="ctl00_RightColumn_Categories1_repCategories_ctl02_spaCount" class="articlecount">(28 articles)</span>
    	        </div>
            
                <img id="ctl00_RightColumn_Categories1_repCategories_ctl03_imgSpacer" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/sidenav_net_lines_320x3.jpg" style="height: 3px; width: 320px; border-width: 0px;"><br>
            
    	        <div class="navitem">
    	            <img id="ctl00_RightColumn_Categories1_repCategories_ctl04_imgArrow" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_arrow_white_5x9.gif" style="height: 9px; width: 5px; border-width: 0px;">&nbsp;&nbsp;<a id="ctl00_RightColumn_Categories1_repCategories_ctl04_lnkCategory" href="http://www.simple-talk.com/dotnet/windows-forms/">Windows Forms</a> <span id="ctl00_RightColumn_Categories1_repCategories_ctl04_spaCount" class="articlecount">(5 articles)</span>
    	        </div>
            
                <img id="ctl00_RightColumn_Categories1_repCategories_ctl05_imgSpacer" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/sidenav_net_lines_320x3.jpg" style="height: 3px; width: 320px; border-width: 0px;"><br>
            
    	        <div class="navitem">
    	            <img id="ctl00_RightColumn_Categories1_repCategories_ctl06_imgArrow" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_arrow_white_5x9.gif" style="height: 9px; width: 5px; border-width: 0px;">&nbsp;&nbsp;<a id="ctl00_RightColumn_Categories1_repCategories_ctl06_lnkCategory" href="http://www.simple-talk.com/dotnet/.net-framework/">.Net Framework</a> <span id="ctl00_RightColumn_Categories1_repCategories_ctl06_spaCount" class="articlecount">(96 articles)</span>
    	        </div>
            
                <img id="ctl00_RightColumn_Categories1_repCategories_ctl07_imgSpacer" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/sidenav_net_lines_320x3.jpg" style="height: 3px; width: 320px; border-width: 0px;"><br>
            
    	        <div class="navitem">
    	            <img id="ctl00_RightColumn_Categories1_repCategories_ctl08_imgArrow" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_arrow_white_5x9.gif" style="height: 9px; width: 5px; border-width: 0px;">&nbsp;&nbsp;<a id="ctl00_RightColumn_Categories1_repCategories_ctl08_lnkCategory" href="http://www.simple-talk.com/dotnet/performance/">Performance</a> <span id="ctl00_RightColumn_Categories1_repCategories_ctl08_spaCount" class="articlecount">(14 articles)</span>
    	        </div>
            
                <img id="ctl00_RightColumn_Categories1_repCategories_ctl09_imgSpacer" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/sidenav_net_lines_320x3.jpg" style="height: 3px; width: 320px; border-width: 0px;"><br>
            
    	        <div class="navitem">
    	            <img id="ctl00_RightColumn_Categories1_repCategories_ctl10_imgArrow" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_arrow_white_5x9.gif" style="height: 9px; width: 5px; border-width: 0px;">&nbsp;&nbsp;<a id="ctl00_RightColumn_Categories1_repCategories_ctl10_lnkCategory" href="http://www.simple-talk.com/dotnet/visual-studio/">Visual Studio</a> <span id="ctl00_RightColumn_Categories1_repCategories_ctl10_spaCount" class="articlecount">(10 articles)</span>
    	        </div>
            
                <img id="ctl00_RightColumn_Categories1_repCategories_ctl11_imgSpacer" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/sidenav_net_lines_320x3.jpg" style="height: 3px; width: 320px; border-width: 0px;"><br>
            
    	        <div class="navitem">
    	            <img id="ctl00_RightColumn_Categories1_repCategories_ctl12_imgArrow" src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_arrow_white_5x9.gif" style="height: 9px; width: 5px; border-width: 0px;">&nbsp;&nbsp;<a id="ctl00_RightColumn_Categories1_repCategories_ctl12_lnkCategory" href="http://www.simple-talk.com/dotnet/.net-tools/">.Net Tools</a> <span id="ctl00_RightColumn_Categories1_repCategories_ctl12_spaCount" class="articlecount">(66 articles)</span>
    	        </div>
            
    </div>
    <div class="footer"></div>  
</div>
    <div class="sidepanels">
        
        
        
<div class="widget" id="pinvoke">
    <div class="header"><a href="http://www.pinvoke.net/?utm_source=simpletalk&amp;utm_medium=box&amp;utm_campaign=pinvoke"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/1px.gif" alt="recommended site pinvoke" width="315" height="50"></a></div>
    <div class="middle">
      <div class="widgetcontent">
        <br>PInvoke.net is a user-driven wiki which provides .NET 
developers with native method signatures, so they don't have to spend 
time writing them from scratch.<br><br><br>
        <a href="http://www.pinvoke.net/?utm_source=simpletalk&amp;utm_medium=box&amp;utm_campaign=pinvoke"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/btn_pinvoke.gif" width="157" align="right" height="19"></a><br><br>
      </div>
    </div>
    <div class="footer"></div>
</div>

        
        
        
<div style="display: block;" class="widget hidden" id="RSSfeedwidget">
    <div class="header"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/1px.gif" title="RSS Feeds" width="315" height="50"></div>
    <div class="middle">
        <div class="RSSselectors">
            <div class="rss-inputs">
                <input name="rss" id="sqlFeed" value="2" checked="checked" type="checkbox"><label for="sqlFeed">SQL</label><br>
                <input name="rss" id="netFeed" value="3" checked="checked" type="checkbox"><label for="netFeed">.NET</label><br>
                <input name="rss" id="exchangeFeed" value="31" checked="checked" type="checkbox"><label for="exchangeFeed">SysAdmin</label><br>
                <input name="rss" id="opinionFeed" value="4" checked="checked" type="checkbox"><label for="opinionFeed">Opinion</label><br>
                <input name="rss" id="booksFeed" value="35" checked="checked" type="checkbox"><label for="booksFeed">Books</label><br>
                <input name="rss" id="blogsFeed" value="B" checked="checked" type="checkbox"><label for="blogsFeed">Blogs</label><br>                
                <a id="rssGetLink" href="http://www.simple-talk.com/rss.aspx" onclick="RssGetSide(false); return(false);" style="display: block; margin-top: 10px;"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/btn-get-my-feed.gif" alt="Get my feed" width="117" height="19"></a>
            </div>
            <div class="rss-buttons">
                <div class="rss-advanced">
                    If you update your feed, please remember to tell your RSS reader the new URL
                    <br><br>
                    <a id="rssAdvLink" href="http://www.simple-talk.com/rsssel.aspx" onclick="RssGetSide(true); return(false);">Click here for <b>advanced</b> RSS options</a>
                </div>
            </div>
        </div>
        <div style="clear: both;"></div>
    </div>
    <div class="footer"></div>
</div>      
        
        
        
        
<div class="widget" id="topratedarticles">
    <div class="header"><a id="ctl00_RightColumn_ArticlesRated1_lnkHeader"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/1px.gif" title="Phil Factor - the wilder shores of transact sql" width="300" height="30"></a></div>
    <div class="middle">
        <div class="widgetcontent">
            
                    <strong><a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl00_lnkArticle1" href="http://www.simple-talk.com/dotnet/.net-tools/smartassembly-eating-our-own-dogfood/">SmartAssembly: Eating Our Own Dogfood</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;Quite often at Red Gate, we are some of our own most enthusiastic software-users. SmartAssembly is a...&nbsp;<a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl00_lnkArticle2" href="http://www.simple-talk.com/dotnet/.net-tools/smartassembly-eating-our-own-dogfood/">Read more...</a><br><br>
                
                    <strong><a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl01_lnkArticle1" href="http://www.simple-talk.com/dotnet/.net-tools/has-.net-reflector-saved-your-bacon/">Has .NET Reflector Saved Your Bacon?</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;We think Reflector is a fantastic tool, and we know you do too. We'd love to hear about the times...&nbsp;<a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl01_lnkArticle2" href="http://www.simple-talk.com/dotnet/.net-tools/has-.net-reflector-saved-your-bacon/">Read more...</a><br><br>
                
                    <strong><a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl02_lnkArticle1" href="http://www.simple-talk.com/dotnet/.net-framework/making-html-tables-easier-on-the-eye--css-structural-pseudo-classes/">Making HTML tables easier on the eye- CSS Structural Pseudo-classes</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;We asked Phil why his PowerShell tabular reports looked so nice. 'CSS structural pseudo-classes' he...&nbsp;<a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl02_lnkArticle2" href="http://www.simple-talk.com/dotnet/.net-framework/making-html-tables-easier-on-the-eye--css-structural-pseudo-classes/">Read more...</a><br><br>
                
                    <strong><a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl03_lnkArticle1" href="http://www.simple-talk.com/dotnet/.net-tools/down-the-rabbit-hole--a-study-in-powershell-pipelines,-functions,-and-parameters/">Down the Rabbit Hole- A Study in PowerShell Pipelines, Functions, and Parameters</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;For an experienced programmer to learn a new language can be a journey quite like Alice's in...&nbsp;<a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl03_lnkArticle2" href="http://www.simple-talk.com/dotnet/.net-tools/down-the-rabbit-hole--a-study-in-powershell-pipelines,-functions,-and-parameters/">Read more...</a><br><br>
                
                    <strong><a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl04_lnkArticle1" href="http://www.simple-talk.com/dotnet/.net-framework/xpath,-css,-dom-and-selenium-the-rosetta-stone/">XPath, CSS, DOM and Selenium: The Rosetta Stone</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;Some programming conventions are best represented in a chart. Nobody will claim that XPath or CSS are...&nbsp;<a id="ctl00_RightColumn_ArticlesRated1_repArticles_ctl04_lnkArticle2" href="http://www.simple-talk.com/dotnet/.net-framework/xpath,-css,-dom-and-selenium-the-rosetta-stone/">Read more...</a><br><br>
                
        </div>
    </div>
    <div class="footer"></div>
</div>
        

<div class="widget" id="mostviewedarticles">
    <div class="header"><a id="ctl00_RightColumn_ArticlesViewed1_lnkHeader"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/1px.gif" title="Phil Factor - the wilder shores of transact sql" width="300" height="30"></a></div>
    <div class="middle">
        <div class="widgetcontent">
            
                    <strong><a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl00_lnkArticle1" href="http://www.simple-talk.com/dotnet/asp.net/a-complete-url-rewriting-solution-for-asp.net-2.0/">A Complete URL Rewriting Solution for ASP.NET 2.0</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;Ever wondered whether it's possible to create neater URLS, free of bulky Query String parameters?...&nbsp;<a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl00_lnkArticle2" href="http://www.simple-talk.com/dotnet/asp.net/a-complete-url-rewriting-solution-for-asp.net-2.0/">Read more...</a><br><br>
                
                    <strong><a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl01_lnkArticle1" href="http://www.simple-talk.com/dotnet/visual-studio/visual-studio-setup---projects-and-custom-actions/">Visual Studio Setup - projects and custom actions</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;This article describes the kinds of custom actions that can be used in your Visual Studio setup project.&nbsp;<a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl01_lnkArticle2" href="http://www.simple-talk.com/dotnet/visual-studio/visual-studio-setup---projects-and-custom-actions/">Read more...</a><br><br>
                
                    <strong><a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl02_lnkArticle1" href="http://www.simple-talk.com/dotnet/.net-framework/.net-application-architecture-the-data-access-layer/">.NET Application Architecture: the Data Access Layer</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;Find out how to design a robust data access layer for your .NET applications.&nbsp;<a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl02_lnkArticle2" href="http://www.simple-talk.com/dotnet/.net-framework/.net-application-architecture-the-data-access-layer/">Read more...</a><br><br>
                
                    <strong><a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl03_lnkArticle1" href="http://www.simple-talk.com/dotnet/asp.net/web-parts-in-asp.net-2.0/">Web Parts in ASP.NET 2.0</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;Most Web Parts implementations allow users to create a single portal page where they can personalize...&nbsp;<a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl03_lnkArticle2" href="http://www.simple-talk.com/dotnet/asp.net/web-parts-in-asp.net-2.0/">Read more...</a><br><br>
                
                    <strong><a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl04_lnkArticle1" href="http://www.simple-talk.com/dotnet/windows-forms/configuring-forms-authentication-in-sharepoint-2007/">Configuring Forms Authentication in SharePoint 2007</a></strong><br>
                    <img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/w_icon_article_9x11.jpg" width="9" height="11">&nbsp;Damon Armstrong provides a step-by-step guide to the processes, quirks and pitfalls of setting up...&nbsp;<a id="ctl00_RightColumn_ArticlesViewed1_repArticles_ctl04_lnkArticle2" href="http://www.simple-talk.com/dotnet/windows-forms/configuring-forms-authentication-in-sharepoint-2007/">Read more...</a><br><br>
                
        </div>
    </div>
    <div class="footer"></div>
</div>
        
      <div class="widget" id="WhyJoin">
        <div class="header"><a id="ctl00_RightColumn_WhyJoin1_LoginView1_lnkJoin1" href="http://www.simple-talk.com/community/user/CreateUser.aspx?ReturnUrl=%2fdotnet%2f.net-tools%2fgathering-rss-feeds-using-visual-studio-and-rss.net%2f"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/1px.gif" title="Join Simple Talk" width="315" height="50"></a></div>
        <div class="middle">
          <div class="widgetcontent">
		<a id="ctl00_RightColumn_WhyJoin1_LoginView1_lnkJoin2" href="http://www.simple-talk.com/community/user/CreateUser.aspx?ReturnUrl=%2fdotnet%2f.net-tools%2fgathering-rss-feeds-using-visual-studio-and-rss.net%2f"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/icon_newsletter_54x43.jpg" class="paper" title="Join Simple Talk" width="54" align="left" height="43"></a>
		Over 400,000 Microsoft professionals subscribe to the Simple-Talk 
technical journal. Join today, it's fast, simple, free and secure.<br><br>
		    <div class="joinbutton"><a id="ctl00_RightColumn_WhyJoin1_LoginView1_lnkJoin3" href="http://www.simple-talk.com/community/user/CreateUser.aspx?ReturnUrl=%2fdotnet%2f.net-tools%2fgathering-rss-feeds-using-visual-studio-and-rss.net%2f"><img src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/btn_join_117x19.jpg" alt="Join Simple Talk" width="117" height="19"></a></div>
          </div>
        </div>
        <div class="footer"></div>
      </div>
    
    </div>

                <div class="clear"></div><br>
            </div>
            <div class="clear"></div><br>
            <div class="pagefooter">
                <div class="pagefooternavright">
                    <a id="ctl00_lnkGotoPrivacy" href="http://www.simple-talk.com/privacy-policy.aspx">Privacy policy</a> |
                    <a id="ctl00_lnkGotoTerms" href="http://www.simple-talk.com/terms-and-conditions.aspx">Terms and conditions</a> |
                    <a href="http://www.red-gate.com/" target="_blank">©2005-2011 Red Gate Software</a>
                </div>
                <div class="pagefooternavleft">
                    <a id="ctl00_lnkGotoAbout" href="http://www.simple-talk.com/about.aspx">About</a> |
                    <a id="ctl00_lnkGotoSitemap" href="http://www.simple-talk.com/site-map.aspx">Site map</a> |
                    <a id="ctl00_lnkGotoAuthor" href="http://www.simple-talk.com/become-an-author.aspx">Become an author</a> |
                    <a id="ctl00_lnkGotoArchive" href="http://www.simple-talk.com/newsletter-archive/">Newsletters</a> |
                    <a id="ctl00_lnkGotoContact" href="http://www.simple-talk.com/contact-us.aspx">Contact us</a>
                </div>
            </div>
        </div>
    </div>


<script type="text/javascript">
//<![CDATA[
Sys.Application.initialize();
//]]>
</script>
</form>
<script src="Gathering%20RSS%20Feeds%20using%20Visual%20Studio%20and%20RSS.NET_files/urchin.js" type="text/javascript"></script>
<script type="text/javascript">
_uacct = "UA-90206-4";
urchinTracker();
</script>
</body></html>